package com.akjava.gwt.html5test.client;
import java.util.List;
import com.akjava.gwt.html5.client.file.File;
import com.akjava.gwt.html5.client.file.FileHandler;
import com.akjava.gwt.html5.client.file.FileReader;
import com.akjava.gwt.html5.client.file.FileUploadForm;
import com.akjava.gwt.html5.client.file.FileUtils;
import com.akjava.gwt.html5.client.file.FileUtils.DataURLListener;
import com.akjava.gwt.html5.client.file.FileUtils.DataURLsListener;
import com.akjava.gwt.html5.client.file.Uint8Array;
import com.akjava.gwt.html5.client.file.ui.DropVerticalPanelBase;
import com.akjava.gwt.html5.client.file.webkit.DirectoryCallback;
import com.akjava.gwt.html5.client.file.webkit.FileEntry;
import com.akjava.gwt.html5.client.file.webkit.FilePathCallback;
import com.akjava.gwt.html5.client.file.webkit.Item;
import com.google.common.collect.Lists;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.event.dom.client.DragLeaveEvent;
import com.google.gwt.event.dom.client.DragLeaveHandler;
import com.google.gwt.event.dom.client.DragOverEvent;
import com.google.gwt.event.dom.client.DragOverHandler;
import com.google.gwt.event.dom.client.DropEvent;
import com.google.gwt.event.dom.client.DropHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;
public class HTML5Test implements EntryPoint {
public static DropVerticalPanelBase dropPanel;
private TextArea firstTextArea;
public static void doneDrop(){
dropPanel.setBorderWidth(0);
}
@Override
public void onModuleLoad() {
dropPanel=new DropVerticalPanelBase();
dropPanel.setSize("100%", "100%");
dropPanel.setBorderWidth(0);
dropPanel.setStylePrimaryName("border");
RootLayoutPanel.get().add(dropPanel);
dropPanel.addDragOverHandler(new DragOverHandler() {
@Override
public void onDragOver(DragOverEvent event) {
event.preventDefault();
//GWT.log("drag over");
dropPanel.setBorderWidth(4);
}
});
dropPanel.addDropHandler(new DropHandler() {
@Override
public void onDrop(DropEvent event) {
event.preventDefault();
//GWT.log("drag over");
}
});
dropPanel.addDragLeaveHandler(new DragLeaveHandler() {
@Override
public void onDragLeave(DragLeaveEvent event) {
event.preventDefault();
doneDrop();
//GWT.log("drag leave");
}
});
TabPanel tab=new TabPanel();
dropPanel.add(tab);
VerticalPanel root = new VerticalPanel();
tab.add(root,"File upload");
root.add(new Label("Text file upload Test,drop a text file at textarea and show text"));
firstTextArea = new TextArea();
firstTextArea.setSize("400px", "200px");
firstTextArea.addDragOverHandler(new DragOverHandler() {
@Override
public void onDragOver(DragOverEvent event) {
event.preventDefault();
}
});
FileUploadForm fileUpload=FileUtils.createSingleTextFileUploadForm(new DataURLListener() {
@Override
public void uploaded(File file, String text) {
firstTextArea.setText(text);
}
}, false);
root.add(fileUpload);
firstTextArea.addDropHandler(new DropHandler() {
@Override
public void onDrop(DropEvent event) {
onDropText(event);
}
});
root.add(firstTextArea);
root.add(new Label("Chrome folder support test,drop folder at textarea and show file list"));
final TextArea area2 = new TextArea();
FileUploadForm multiUpload=FileUtils.createMultiFileUploadForm(new DataURLsListener() {
@Override
public void uploaded(List<File> files, List<String> values) {
for(File file:files){
String name=file!=null?file.getFileName() :"";
String size=file!=null?""+file.getFileSize():"";
String newText = ""+"/"+name+ ","
+ size;
String old = area2.getText();
area2.setText(old + newText+"\n");
}
}
}, false);
root.add(multiUpload);
multiUpload.setTitle("can select multifile,but only same directory");
area2.setSize("400px", "200px");
area2.addDropHandler(new DropHandler() {
@Override
public void onDrop(DropEvent event) {
event.preventDefault();
final FilePathCallback callback = new FilePathCallback() {
@Override
public void callback(File file,String path) {
log(file);
String name=file!=null?file.getFileName() :"";
String size=file!=null?""+file.getFileSize():"";
String newText = path+"/"+name+ ","
+ size;
String old = area2.getText();
area2.setText(old + newText+"\n");
}
};
final JsArray<Item> items = FileUtils.transferToItem(event
.getNativeEvent());
GWT.log("length:" + items.length());
if (items.length() > 0) {
for (int i = 0; i < items.length(); i++) {
log(items.get(i).webkitGetAsEntry());
FileEntry entry = items.get(i).webkitGetAsEntry();
entryCallback(entry,callback,"");
}
}
doneDrop();
}
});
root.add(area2);
DropVerticalPanelBase dropBase=new DropVerticalPanelBase();
//need some content
dropBase.add(new Label("Drop VerticalPanel Test,drop a file below and alert file name"));
dropBase.addDropHandler(new DropHandler() {
@Override
public void onDrop(DropEvent event) {
final JsArray<File> files = FileUtils.transferToFile(event
.getNativeEvent());
GWT.log("length:" + files.length());
Window.alert(""+files.get(0).getFileName());
event.preventDefault();
doneDrop();
}
});
root.add(dropBase);
//need this after chrome 27?
dropBase.addDragOverHandler(new DragOverHandler() {
@Override
public void onDragOver(DragOverEvent event) {
}
});
dropBase.setSize("400px", "200px");
/*
dropBase.add(new Button("test"));
dropBase.add(new TextArea());
Canvas c=Canvas.createIfSupported();
dropBase.add(c);
*/
tab.add(new InputRangeTest(),"Input Range");
tab.add(new FileWriteTest(),"File Download");
tab.add(new FileSystemTest(),"File System");
tab.add(new SpeechTest(),"Speech Synth");
tab.add(new RecognizeTest(),"Speech Recognize");
tab.add(new MediaTest(),"Media");
int index=0;
String token=History.getToken();
List<String> labels=Lists.newArrayList("upload","range","download","filesystem","synth","recognize","media");
for(int i=0;i<labels.size();i++){
if(labels.get(i).equals(token)){
index=i;
break;
}
}
tab.selectTab(index);
dropPanel.add(new Anchor("Github Project Page","https://github.com/akjava/html5gwt"));
}
private void onDropText(DropEvent event){
final boolean asString = true;
event.preventDefault();
final FileReader reader = FileReader.createFileReader();
final JsArray<File> files = FileUtils.transferToFile(event
.getNativeEvent());
GWT.log("length:" + files.length());
if (files.length() > 0) {
reader.setOnLoad(new FileHandler() {
@Override
public void onLoad() {
log("loaded:");
String text = "";
if (asString) {
text = reader.getResultAsString();
} else {
Uint8Array array = reader.getResultAsBuffer();
log("length:" + array.length());
StringBuilder builder = new StringBuilder();
for (int i = 0; i < array.length(); i++) {
builder.append((char) array.get(i));
}
builder.toString();
}
firstTextArea.setText(text);
}
});
log(files.get(0));
if (asString) {
reader.readAsText(files.get(0), "UTF-8");
} else {
reader.readAsArrayBuffer(files.get(0));
}
}
// event.stopPropagation();
doneDrop();
}
public void entryCallback(final FileEntry entry,final FilePathCallback callback,String path){
if(entry==null){
return;
}
if (entry.isFile()) {
entry.file(callback,path);
} else if (entry.isDirectory()) {
entry.getReader().readEntries(
new DirectoryCallback() {
@Override
public void callback(
JsArray<FileEntry> entries) {
callback.callback(null, entry.getFullPath());
for (int j = 0; j < entries
.length(); j++) {
entryCallback(entries.get(j),callback,entry.getFullPath());
}
}
});
}
}
public static final native void doit(JavaScriptObject obj)/*-{
var buf = new $wnd.Uint8Array(obj);
$wnd.console.log(buf);
for ( var i = 0; i < buf.length; i++) {
$wnd.console.log(String.fromCharCode(buf[i]));
}
}-*/;
/*
* can not shift
*/
public static final native void log(JavaScriptObject obj)/*-{
$wnd.console.log(obj);
}-*/;
public static final native void log(String obj)/*-{
$wnd.console.log(obj);
}-*/;
}